package com.dsj.common.redis.shiro;


import org.springframework.beans.factory.annotation.Value;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Set;

/**
 *
 */
public class RedisManager {

  private static JedisPool jedisPool = null;
  @Value("${spring.redis.host}")
  private String host = "127.0.0.1";
  @Value("${spring.redis.port}")
  private int port = 6379;
  // 0 - never expire
  private int expire = 0;
  //timeout for jedis try to connect to redis server, not expire time! In milliseconds
  @Value("${spring.redis.timeout}")
  private int timeout = 0;
  @Value("${spring.redis.password}")
  private String password = "";

  public RedisManager() {

  }

  /**
   * 初始化方法
   */
  public void init() {
    if (jedisPool == null) {
      if (password != null && !"".equals(password)) {
        jedisPool = new JedisPool(new JedisPoolConfig(), host, port, timeout, password);
      } else if (timeout != 0) {
        jedisPool = new JedisPool(new JedisPoolConfig(), host, port, timeout);
      } else {
        jedisPool = new JedisPool(new JedisPoolConfig(), host, port);
      }

    }
  }

  /**
   * get value from redis
   *
   * @param key
   *
   * @return
   */
  public byte[] get(byte[] key) {
    byte[] value = null;
    Jedis jedis = jedisPool.getResource();
    try {
      value = jedis.get(key);
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    return value;
  }

  /**
   * set
   *
   * @param key
   * @param value
   *
   * @return
   */
  public byte[] set(byte[] key, byte[] value) {
    Jedis jedis = jedisPool.getResource();
    try {
      jedis.set(key, value);
      if (this.expire != 0) {
        jedis.expire(key, this.expire);
      }
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    return value;
  }

  /**
   * set
   *
   * @param key
   * @param value
   * @param expire
   *
   * @return
   */
  public byte[] set(byte[] key, byte[] value, int expire) {
    Jedis jedis = jedisPool.getResource();
    try {
      jedis.set(key, value);
      if (expire != 0) {
        jedis.expire(key, expire);
      }
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    return value;
  }

  /**
   * del
   *
   * @param key
   */
  public void del(byte[] key) {
    Jedis jedis = jedisPool.getResource();
    try {
      jedis.del(key);
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }

  /**
   * flush
   */
  public void flushDB() {
    Jedis jedis = jedisPool.getResource();
    try {
      jedis.flushDB();
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }

  /**
   * size
   */
  public Long dbSize() {
    Long dbSize = 0L;
    Jedis jedis = jedisPool.getResource();
    try {
      dbSize = jedis.dbSize();
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    return dbSize;
  }

  /**
   * keys
   *
   * @param regex
   *
   * @return
   */
  public Set<byte[]> keys(String pattern) {
    Set<byte[]> keys = null;
    Jedis jedis = jedisPool.getResource();
    try {
      keys = jedis.keys(pattern.getBytes());
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
    return keys;
  }

  public String getHost() {
    return host;
  }

  public void setHost(String host) {
    this.host = host;
  }

  public int getPort() {
    return port;
  }

  public void setPort(int port) {
    this.port = port;
  }

  public int getExpire() {
    return expire;
  }

  public void setExpire(int expire) {
    this.expire = expire;
  }

  public int getTimeout() {
    return timeout;
  }

  public void setTimeout(int timeout) {
    this.timeout = timeout;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }


}
